#include<iostream>
#include<unordered_map>
#include<map>

using std::cout;
using std::endl;
using std::unordered_map;
using std::map;

class LRUCache
{
public:
    LRUCache(size_t max)
        :_max(max)
    {
        cout<<"狗砸"<<endl;
    }
    void put(int key,int value)
    {
        //如何表示value能够直接获取
        
        if(!_cache.count(key))
        {
        _cache[key].insert({0,value});
        _cache[key].insert({1,++_num});
        _time[_num]=key;
        }
        else
        {
            _cache[key][0]=value;
            _time.erase(_cache[key][1]);
            _cache[key][1]=++_num;
            _time[_num]=key;
        }

        if(_cache.size()>_max)
        {
            cout<<" out "<<_time.begin()->second<<endl;
            _cache.erase(_time.begin()->second);
            _time.erase(_time.begin());
        }
    }
    int get(int key)
    {
        if(!_cache.count(key))
        {
            cout<<"get -1 "<<endl;
            return -1;
        }
            _time.erase(_cache[key][1]);
            _cache[key][1]=++_num;
            _time[_num]=key;
            cout<<"get "<<_cache[key][0]<<endl;
            return _cache[key][0];
    }


private:
    size_t _max=10;
    unordered_map<int,map<int,int>> _cache;
    map<int,int> _time;
    int _num=-1;

};
int main(void)
{
    LRUCache lRUCache(2);
    lRUCache.put(1, 1); // 缓存是 {1=1}
lRUCache.put(2, 2); // 缓存是 {1=1, 2=2}
lRUCache.get(1); // 返回 1
lRUCache.put(3, 3); // 该操作会使得关键字 2 作废，缓存是 {1=1, 3=3}
lRUCache.get(2); // 返回 -1 (未找到)
lRUCache.put(4, 4); // 该操作会使得关键字 1 作废，缓存是 {4=4, 3=3}
lRUCache.get(1); // 返回 -1 (未找到)
lRUCache.get(3); // 返回 3
lRUCache.get(4); // 返回 4
}

